Web server to client (and client to web server) communications over HTTP need to perform well under a wide variety of conditions. Legacy communication techniques (e.g., asynchronous javascript and XML (AJAX)) as used in many web applications rely on a middleware server that updates a portion of a web page such that it is possible to update parts of a web page without reloading the whole page. This facility can be used for implementing HTTP GET and PUT calls. Unfortunately, performing an HTTP GET and PUT calls involves establishment and tear-down of a connection in a half-duplex regime, thus introducing overhead for each HTTP GET or PUT. The effects of establishment and tear-down of a connection in a half-duplex regime is exacerbated as the overall number of data packets increases (e.g., with transfers of large numbers of smaller files), since the overhead becomes more significant as a percentage of overall time spent to perform the data transfers.
The websocket communication protocol can be used to establish a persistent communication socket, and thus permit full-duplex communications that can be parallelized and/or throttled during a communication session. Unfortunately, the websockets facility has no provisions for determining how much to parallelize and/or how much to throttle. Absent sufficient information needed to determine how much to parallelize and/or how much to throttle (e.g., throttling ability lost or diminished at the application level), the traffic flow in a communication session can suffer due to (1) poor performance related to overwhelming the nodes in the route between the source and destination (e.g., if a lot of outgoing messages are sent in an oversized burst of outgoing HTTP traffic), or (2) poor performance due to under-utilization of network resources (e.g., when too few parallelized outgoing messages are sent in an undersized burst of outgoing HTTP traffic). What is needed is a way to shape outgoing HTTP traffic based on upstream routing performance observations. Moreover, what is needed is a way to continuously shape outgoing HTTP traffic based on upstream routing performance observations that may change during a communication session.
The problem to be solved is rooted in technological limitations of legacy approaches. Improved techniques, in particular improved application of technology, are needed to address the problem of improving the performance of uploads and downloads of content over HTTP. More specifically, the technologies applied in the aforementioned legacy approaches fail to achieve the sought-after capabilities of the herein-disclosed techniques for dynamically shaping network traffic when using full-duplex communications.